package com.example;

/**
 * 父类：包含构造方法中调用可重写方法的危险示例
 */
class Parent {
    /**
     * 父类构造方法
     * 危险：在构造方法中调用可重写方法
     */
    public Parent() {
        System.out.println("开始执行Parent构造方法");
        func();  // 危险调用：可能调用子类重写的方法
        System.out.println("Parent构造方法执行完成");
    }

    /**
     * 可重写的方法
     * 此方法可能被子类重写，访问子类特有的成员变量
     */
    public void func() {
        System.out.println("Parent.func() - 父类方法安全执行");
    }
}

/**
 * 子类：重写父类方法并拥有自己的成员变量
 */
class Child extends Parent {
    /**
     * 子类成员变量，声明时初始化为10
     * 注意：这个初始化在父类构造方法执行完成后才进行
     */
    private int value = 10;

    /**
     * 子类构造方法
     * 隐式调用父类构造方法，然后初始化成员变量
     */
    public Child() {
        // 隐式调用super() - 父类Parent的构造方法
        System.out.println("开始执行Child构造方法");
        System.out.println("value为: " + value);
        System.out.println("Child构造方法执行完成");
    }

    /**
     * 重写父类的func方法
     * 风险：在父类构造方法中被调用时，value尚未初始化
     */
    @Override
    public void func() {
        // 危险：在父类构造方法中调用时，value还未被初始化为10
        System.out.println("Child.func() - value为: " + value);
    }

    public static void main(String[] args) {
        System.out.println("开始创建Child对象...");
        Child child = new Child();  // 创建子类对象，触发问题

        System.out.println("\n对象创建完成后，正常调用func方法：");
        child.func();  // 正常调用，此时value已正确初始化
    }
}





/* 执行结果：
开始创建Child对象...
开始执行Parent构造方法
Child.func() - value为: 0   （问题：value输出0，而不是10）
Parent构造方法执行完成
开始执行Child构造方法
value为: 10
Child构造方法执行完成

对象创建完成后，正常调用func方法：
Child.func() - value为: 10   （正常：value正确输出10）
*/